package com.ssh.util;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by ZK on 2018/2/8.  工具类
 */
public class MyTool {

    /*************************************************************************************************************************
     *                                                  Start:  NewUUid                                                       *
     *                                                  功能：随机生成一个id                                                    *
     *                                                  返回：String                                                           *
     ************************************************************************************************************************/
    public static String NewUUid() {
        String uuid = UUID.randomUUID().toString().toUpperCase();
        return uuid;
    }
    //----------------------------------------------------End:  NewUUid-----------------------------------------------------//





    /*************************************************************************************************************************
     *                                                  Start:  isNull                                                        *
     *                                                  功能：判断对象是否为null或者判断字符串是否为""                            *
     *                                                  返回：true or false                                                   *
     ************************************************************************************************************************/
    public static boolean isNull(Object testStr) {
        return (testStr == null || testStr.toString().trim().equals("") || testStr.toString().trim().equals("null"));
    }
    //----------------------------------------------------End:  isNull-----------------------------------------------------//






    /*************************************************************************************************************************
     *                                                  Start:  JsonToObject                                                  *
     *                                                  功能：将json中存在的属性填充object对象对应的属性                          *
     *                                                        1.如果json有obj没有的属性，那该属性被忽略                          *
     *                                                        2.如果obj属性有值，json将覆盖其值                                 *
     *                                                  返回： 一般不需要返回，直接Util.JsonToClassObj(xx,yy)                   *
     ************************************************************************************************************************/
    public static Object JsonToObject(Object obj, JSONObject json) {
        if (json == null)
            return obj;
        if (obj == null)
            return obj;
        Iterator it = json.keys();
        // 遍历jsonObject数据，添加到Map对象
        while (it.hasNext()) {
            String key = String.valueOf(it.next());
            Object value;
            try {
                value = json.get(key);
                if (!(value instanceof JSONObject) && !(value instanceof JSONArray))
                    setField(obj, key, value);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return obj;
    }
    //----------------------------------------------------End:  JsonToObject-----------------------------------------------//






    /*************************************************************************************************************************
     *                                                  Start:  StringToDate                                                 *
     *                                                  功能：将String格式的日期转化成Date类型                                  *
     *                                                  String格式：yyyy-mm-dd  或  yyyy.mm.dd  或  yyyy/mm/dd                *
     *                                                  返回： 一般不需要返回，直接Util.JsonToClassObj(xx,yy)                   *
     ************************************************************************************************************************/
    public static Date StringToDate(String date) {
        try {
            if(!MyTool.isNull(date)&&date.indexOf(".")!=-1){
                date = date.replaceAll("\\.", "-");
            }
            String formatStr = analyseDateFormat(date);
            if (formatStr == null) {
                DateFormat sd = SimpleDateFormat.getDateTimeInstance();
                return sd.parse(date);// .parse(date);
            } else {
                SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
                return sdf.parse(date);
            }
        } catch (java.text.ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    //----------------------------------------------------End:  StringToDate-----------------------------------------------//











    /*********************************************************************************************分割线*********************************************************************************************
     */








    /*************************************************************************************************************************
     *                                                  Start:  其他辅助工具，目前未深入研究                                    *
     ************************************************************************************************************************/
    public static boolean isNumeric(String str) {
        if (str == null || str.trim().equals("")) {
            return false;
        }
        Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*([Ee]{1}[0-9]+)?");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }
    /**
     * date日期
     * @return日期格式
     */
    private static String analyseDateFormat(String date) {
        String result = null;
        String input = date.trim();
        if (Pattern.matches("\\d{2,4}-\\d{1,2}-\\d{1,2}.*", input)) {
            result = "yyyy-MM-dd";
        } else if (Pattern.matches("\\d{1,2}-\\d{1,2}-\\d{2,4}.*", input)) {
            result = "MM-dd-yyyy";
        } else if (Pattern.matches("\\d{2,4}/\\d{1,2}/\\d{1,2}.*", input)) {
            result = "yyyy/MM/dd";
        } else if (Pattern.matches("\\d{1,2}/\\d{1,2}/\\d{2,4}.*", input)) {
            result = "MM/dd/yyyy";
        } else if (Pattern.matches("\\d{6,8}.*", input)) {
            result = "yyyyMMdd";
        }
        if (date.trim().length() > 12) {
            result = result + " HH:mm:ss";
        }
        return result;
    }
    /**
     * 当属性类型为接口时，传入的实际对象class不等于接口，会导致 NoSuchMethodException 异常
     *
     * @param obj
     * @param fieldname
     * @param value
     * @throws SecurityException
     * @throws NoSuchMethodException
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    public static void setField(Object obj, String fieldname, Object value) throws SecurityException,
            NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        setField(obj, fieldname, value, value.getClass());

    }
    public static void setField(Object obj, String fieldname, Object value, Class<?> valueClass)
            throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
            InvocationTargetException {
            if (fieldname.length() > 0) {
                if (PropertyUtils.isWriteable(obj, fieldname)) {
                    Class<?> valueclass = BeanUtils.findPropertyType(fieldname, obj.getClass());
                    Object rObject = Caster(valueclass, String.valueOf(value));
                    PropertyUtils.setProperty(obj, fieldname, rObject);
                }
            }
    }
    /**
     * 字符串到其他类型转换
     * @param type
     * @param value
     * @return
     */
    public static Object Caster(Class<?> type, String value) {

        Object returnValue = null;
        if (value == null || value == "null"||"".equals(value))
            return null;

        if (type.getName().equals("java.util.Date")) {
            if (value.indexOf("Z") != -1 && value.indexOf("T") != -1) {
                returnValue = value;
            } else {
                returnValue = MyTool.StringToDate(value);
            }
        } else if (type.getName().equals("java.sql.Timestamp")) {
            if (value.indexOf("Z") != -1 && value.indexOf("T") != -1) {
                value = value.replace("Z", "");
                value = value.replace("T", " ");
                Date d = MyTool.StringToDate(value);
                Timestamp t = new Timestamp(d.getTime());
                returnValue = t;
            } else {
                Date d = MyTool.StringToDate(value);
                Timestamp t = new Timestamp(d.getTime());
                returnValue = t;
            }
        } else if (type.getName().endsWith("Long")) {
            if (isNumeric(value))
                returnValue = Long.valueOf(value);
        } else if (type.getName().endsWith("Integer")) {
            if (isNumeric(value))
                returnValue = Integer.valueOf(value);
        } else if (type.getName().endsWith("int")) {
            if (isNumeric(value))
                returnValue = Integer.valueOf(value);
            else
                returnValue = 0;
        } else if (type.getName().endsWith("Double")) {
            if (isNumeric(value))
                returnValue = Double.valueOf(value);
        } else if (type.getName().endsWith("double")) {
            if (isNumeric(value))
                returnValue = Double.valueOf(value);
            else
                returnValue = 0.0;
        } else if (type.getName().endsWith("Byte")) {
            if (isNumeric(value))
                returnValue = Byte.valueOf(value);
        } else if (type.getName().endsWith("byte")) {
            if (isNumeric(value))
                returnValue = Byte.valueOf(value);
            else
                returnValue = 0;
        } else if (type.getName().endsWith("Boolean")||type.getName().endsWith("boolean")) {
            returnValue = Boolean.parseBoolean(value);
        } else if (type.getName().endsWith("bool")) {
            returnValue = Boolean.parseBoolean(value);
        } else if (type.getName().endsWith("BigDecimal")) {
            returnValue = new BigDecimal(value);
        } else {
            returnValue = value.toString();
        }
        return returnValue;
    }
    //----------------------------------------------------End:  其他辅助工具，目前未深入研究-----------------------------------------------//






}
